package com.x.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @title: DynamicDataSource
 * @Author X
 * @Date: 2021/1/20 11:19
 * @Version 1.0
 */
public class DynamicCustomerDataSource {
    private static final Logger logger = LoggerFactory.getLogger(DynamicCustomerDataSource.class);

    public DruidDataSource createDefaultDruidDataSource() {
        return createDruidDataSource(2, 16);
    }

    public DruidDataSource createDruidDataSource(int nInitAct, int nMaxAct) {
        DruidDataSource ds = new DruidDataSource();
        ds.setTestWhileIdle(true);// 闲置时候检测
        ds.setPoolPreparedStatements(false);// 官方建议mysql下关闭
        ds.setInitialSize(nInitAct);// 初始化连接数2
        ds.setMinIdle(nInitAct + 2);// 最小空闲连接2
        ds.setMaxActive(nMaxAct);// 最大活动连接20个
        ds.setTimeBetweenEvictionRunsMillis(20 * 60 * 1000);// 每20分钟测试并关闭空闲连接
        ds.setMinEvictableIdleTimeMillis(10 * 60 * 1000);// 空闲10分钟则自动释放
        ds.setMaxWait(30 * 60 * 1000);// 获取连接的超时时间
        ds.setValidationQuery("SELECT 1");// 测试语句
        ds.setTestWhileIdle(true);
        ds.setRemoveAbandoned(true);// 超过时间限制自动回收
        ds.setRemoveAbandonedTimeoutMillis(60 * 60 * 1000L);// 超过60秒自动回收
        ds.setLogAbandoned(true);// 输出回收日志
        ds.getProxyFilters().add(buildWallFilter());// sql防注入
        return ds;
    }

    private WallFilter buildWallFilter() {
        WallConfig wallConfig = new WallConfig();
        wallConfig.setCommentAllow(true);// 可以有注释，建表语句需要注释
        wallConfig.setMultiStatementAllow(true);// 可以执行多条语句
        wallConfig.setNoneBaseStatementAllow(true);//
        // 关闭除基本语句外的其他语句执行，主要的防注入功能
        wallConfig.setDeleteAllow(true);// 不允许删除
        wallConfig.setReplaceAllow(false);// 不允许replace语句
        wallConfig.setDescribeAllow(false);// 不允许Describe
        wallConfig.setShowAllow(true);// 不允许show语句
        wallConfig.setRollbackAllow(false);// 不允许回滚语句
        WallFilter wallFilter = new WallFilter();
        wallFilter.setConfig(wallConfig);
        wallFilter.setDbType("mysql");
        wallFilter.setLogViolation(true);// 对认为是攻击的非法语句,记录LOG.error日志
        wallFilter.setThrowException(true);// 对认为是攻击的非法语句,不抛出sql异常，防止异常未捕获
        return wallFilter;
    }
}
